with the content.
* (bug 51342) prop=imageinfo iicontinue now contains the dbkey, not the text
version of the title.
+* (bug 52538) action=edit will now use empty text instead of the contents
+ of section 0 when passed prependtext or appendtext with section=new.
=== Languages updated in 1.22===
$showEditLinks: boolean describing whether this section has an edit link
'ParserTestParser': Called when creating a new instance of Parser in
-maintenance/parserTests.inc.
+tests/parser/parserTest.inc.
$parser: Parser object created
'ParserTestGlobals': Allows to define globals for parser tests.
# $params: String between element name and >
# $brace: Ending '>' or '/>'
# $rest: Everything until the next element of $bits
- if ( preg_match( '!^(/?)(\\w+)([^>]*?)(/{0,1}>)([^<]*)$!', $x, $regs ) ) {
+ if ( preg_match( '!^(/?)([^\\s/>]+)([^>]*?)(/{0,1}>)([^<]*)$!', $x, $regs ) ) {
list( /* $qbar */, $slash, $t, $params, $brace, $rest ) = $regs;
} else {
$slash = $t = $params = $brace = $rest = null;
$this->dieUsage( "Sections are not supported for this content model: $modelName.", 'sectionsnotsupported' );
}
- // Process the content for section edits
- $section = intval( $params['section'] );
- $content = $content->getSection( $section );
+ if ( $params['section'] == 'new' ) {
+ // DWIM if they're trying to prepend/append to a new section.
+ $content = null;
+ } else {
+ // Process the content for section edits
+ $section = intval( $params['section'] );
+ $content = $content->getSection( $section );
- if ( !$content ) {
- $this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
+ if ( !$content ) {
+ $this->dieUsage( "There is no section {$section}.", 'nosuchsection' );
+ }
}
}
return $store->fetchFromURL( $url );
}
+ /**
+ * Fetch data from multiple URLs with a minimum of round trips
+ *
+ * @param array $urls The URLs of the text to get
+ * @return array Map from url to its data. Data is either string when found
+ * or false on failure.
+ */
+ public static function batchFetchFromURLs( array $urls ) {
+ $batches = array();
+ foreach ( $urls as $url ) {
+ $scheme = parse_url( $url, PHP_URL_SCHEME );
+ if ( $scheme ) {
+ $batches[$scheme][] = $url;
+ }
+ }
+ $retval = array();
+ foreach ( $batches as $proto => $batchedUrls ) {
+ $store = self::getStoreObject( $proto );
+ if ( $store === false ) {
+ continue;
+ }
+ $retval += $store->batchFetchFromURLs( $batchedUrls );
+ }
+ // invalid, not found, db dead, etc.
+ $missing = array_diff( $urls, array_keys( $retval ) );
+ if ( $missing ) {
+ foreach ( $missing as $url ) {
+ $retval[$url] = false;
+ }
+ }
+ return $retval;
+ }
+
/**
* Store a data item to an external store, identified by a partial URL
* The protocol part is used to identify the class, the rest is passed to the
*/
class ExternalStoreDB extends ExternalStoreMedium {
/**
- * The URL returned is of the form of the form DB://cluster/id
+ * The provided URL is in the form of DB://cluster/id
* or DB://cluster/id/itemid for concatened storage.
*
* @see ExternalStoreMedium::fetchFromURL()
*/
public function fetchFromURL( $url ) {
- $path = explode( '/', $url );
- $cluster = $path[2];
- $id = $path[3];
- if ( isset( $path[4] ) ) {
- $itemID = $path[4];
- } else {
- $itemID = false;
- }
-
+ list( $cluster, $id, $itemID ) = $this->parseURL( $url );
$ret =& $this->fetchBlob( $cluster, $id, $itemID );
if ( $itemID !== false && $ret !== false ) {
return $ret;
}
+ /**
+ * Fetch data from given external store URLs.
+ * The provided URLs are in the form of DB://cluster/id
+ * or DB://cluster/id/itemid for concatened storage.
+ *
+ * @param array $urls An array of external store URLs
+ * @return array A map from url to stored content. Failed results
+ * are not represented.
+ */
+ public function batchFetchFromURLs( array $urls ) {
+ $batched = $inverseUrlMap = array();
+ foreach ( $urls as $url ) {
+ list( $cluster, $id, $itemID ) = $this->parseURL( $url );
+ $batched[$cluster][$id][] = $itemID;
+ // false $itemID gets cast to int, but should be ok
+ // since we do === from the $itemID in $batched
+ $inverseUrlMap[$cluster][$id][$itemID] = $url;
+ }
+ $ret = array();
+ foreach ( $batched as $cluster => $batchByCluster ) {
+ $res = $this->batchFetchBlobs( $cluster, $batchByCluster );
+ foreach ( $res as $id => $blob ) {
+ foreach ( $batchByCluster[$id] as $itemID ) {
+ $url = $inverseUrlMap[$cluster][$id][$itemID];
+ if ( $itemID === false ) {
+ $ret[$url] = $blob;
+ } else {
+ $ret[$url] = $blob->getItem( $itemID );
+ }
+ }
+ }
+ }
+ return $ret;
+ }
+
/**
* @see ExternalStoreMedium::store()
*/
$externalBlobCache = array( $cacheID => &$ret );
return $ret;
}
+
+ /**
+ * Fetch multiple blob items out of the database
+ *
+ * @param string $cluster A cluster name valid for use with LBFactory
+ * @param array $ids A map from the blob_id's to look for to the requested itemIDs in the blobs
+ * @return array A map from the blob_id's requested to their content. Unlocated ids are not represented
+ */
+ function batchFetchBlobs( $cluster, array $ids ) {
+ $dbr = $this->getSlave( $cluster );
+ $res = $dbr->select( $this->getTable( $dbr ), array( 'blob_id', 'blob_text' ), array( 'blob_id' => array_keys( $ids ) ), __METHOD__ );
+ $ret = array();
+ if ( $res !== false ) {
+ $this->mergeBatchResult( $ret, $ids, $res );
+ }
+ if ( $ids ) {
+ wfDebugLog( __CLASS__, __METHOD__ . " master fallback on '$cluster' for: " . implode( ',', array_keys( $ids ) ) . "\n" );
+ // Try the master
+ $dbw = $this->getMaster( $cluster );
+ $res = $dbw->select( $this->getTable( $dbr ), array( 'blob_id', 'blob_text' ), array( 'blob_id' => array_keys( $ids ) ), __METHOD__ );
+ if ( $res === false ) {
+ wfDebugLog( __CLASS__, __METHOD__ . " master failed on '$cluster'\n" );
+ } else {
+ $this->mergeBatchResult( $ret, $ids, $res );
+ }
+ }
+ if ( $ids ) {
+ wfDebugLog( __CLASS__, __METHOD__ . " master on '$cluster' failed locating items: " . implode( ',', array_keys( $ids ) ) . "\n" );
+ }
+ return $ret;
+ }
+
+ /**
+ * Helper function for self::batchFetchBlobs for merging master/slave results
+ * @param array &$ret Current self::batchFetchBlobs return value
+ * @param array &$ids Map from blob_id to requested itemIDs
+ * @param mixed $res DB result from DatabaseBase::select
+ */
+ private function mergeBatchResult( array &$ret, array &$ids, $res ) {
+ foreach ( $res as $row ) {
+ $id = $row->blob_id;
+ $itemIDs = $ids[$id];
+ unset( $ids[$id] ); // to track if everything is found
+ if ( count( $itemIDs ) === 1 && reset( $itemIDs ) === false ) {
+ // single result stored per blob
+ $ret[$id] = $row->blob_text;
+ } else {
+ // multi result stored per blob
+ $ret[$id] = unserialize( $row->blob_text );
+ }
+ }
+ }
+
+ protected function parseURL( $url ) {
+ $path = explode( '/', $url );
+ return array(
+ $path[2], // cluster
+ $path[3], // id
+ isset( $path[4] ) ? $path[4] : false // itemID
+ );
+ }
}
*/
abstract public function fetchFromURL( $url );
+ /**
+ * Fetch data from given external store URLs.
+ *
+ * @param array $urls A list of external store URLs
+ * @return array Map from the url to the text stored. Unfound data is not represented
+ */
+ public function batchFetchFromURLs( array $urls ) {
+ $retval = array();
+ foreach ( $urls as $url ) {
+ $data = $this->fetchFromURL( $url );
+ // Dont return when false to allow for simpler implementations.
+ // errored urls are handled in ExternalStore::batchFetchFromURLs
+ if ( $data !== false ) {
+ $retval[$urls] = $data;
+ }
+ }
+ return $retval;
+ }
+
/**
* Insert a data item into a given location
*
* Replace external links (REL)
*
* Note: this is all very hackish and the order of execution matters a lot.
- * Make sure to run maintenance/parserTests.php if you change this code.
+ * Make sure to run tests/parserTests.php if you change this code.
*
* @private
*
* @author Ssola
* @author Toniher
* @author Vriullop
+ * @author XVEC
* @author Àlex
* @author לערי ריינהארט
*/
'oct' => 'oct',
'nov' => 'nov',
'dec' => 'des',
+'january-date' => '$1 de gener',
+'february-date' => '$1 de febrer',
+'march-date' => '$1 de març',
+'april-date' => "$1 d'abril",
+'may-date' => '$1 de maig',
+'june-date' => '$1 de juny',
+'july-date' => '$1 de juliol',
+'august-date' => "$1 d'agost",
+'september-date' => '$1 de setembre',
+'october-date' => "$1 d'octubre",
+'november-date' => '$1 de novembre',
+'december-date' => '$1 de desembre',
# Categories related messages
'pagecategories' => '{{PLURAL:$1|Categoria|Categories}}',
'create-this-page' => 'Crea aquesta pàgina',
'delete' => 'Elimina',
'deletethispage' => 'Elimina la pàgina',
+'undeletethispage' => "Desfés l'eliminació d'aquesta pàgina",
'undelete_short' => "Restaura {{PLURAL:$1|l'edició eliminada|$1 edicions eliminades}}",
'viewdeleted_short' => 'Mostra {{PLURAL:$1|una edició eliminada|$1 edicions eliminades}}',
'protect' => 'Protecció',
'namespaceprotected' => "No teniu permís per a modificar pàgines en l'espai de noms '''$1'''.",
'customcssprotected' => "No teniu permisos per editar la pàgina CSS perquè conté els paràmetres personals d'un altre usuari.",
'customjsprotected' => "No teniu permisos per editar la pàgina JavaScript perquè conté els paràmetres personals d'un altre usuari.",
+'mycustomcssprotected' => 'No tens permís per editar aquesta pàgina CSS.',
+'mycustomjsprotected' => 'No tens permís per editar aquesta pàgina JavaScript.',
+'myprivateinfoprotected' => 'No tens permís per editar la teva informació privada.',
+'mypreferencesprotected' => 'No tens permís per editar les teves preferències.',
'ns-specialprotected' => 'No es poden modificar les pàgines especials.',
'titleprotected' => "La creació d'aquesta pàgina està protegida per [[User:$1|$1]].
Els seus motius han estat: «''$2''».",
'yourname' => "Nom d'usuari",
'userlogin-yourname' => 'Usuari',
'userlogin-yourname-ph' => "Introduïu el vostre nom d'usuari",
+'createacct-another-username-ph' => "Introdueix el nom d'usuari",
'yourpassword' => 'Contrasenya',
'userlogin-yourpassword' => 'Contrasenya',
'userlogin-yourpassword-ph' => 'Introduïu la vostra contrasenya',
'helplogin-url' => 'Help:Registrar-se',
'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Ajuda]]',
'createacct-join' => 'Introduïu les vostres dades.',
+'createacct-another-join' => 'Introdueix la informació del nou compte a continuació:',
'createacct-emailrequired' => 'Adreça de correu electrònic',
'createacct-emailoptional' => 'Adreça de correu electrònic (opcional)',
'createacct-email-ph' => 'Introduïu la vostra adreça de correu electrònic',
+'createacct-another-email-ph' => 'Introdueix una adreça de correu electrònic',
'createaccountmail' => "Utilitza una contrasenya aleatòria temporal i envia-la a l'adreça de correu especificada a continuació.",
'createacct-realname' => 'Nom real (opcional)',
'createaccountreason' => 'Motiu:',
'createacct-captcha' => 'Control de seguretat',
'createacct-imgcaptcha-ph' => 'Introduïu el text que apareix a dalt',
'createacct-submit' => 'Crea el meu compte',
+'createacct-another-submit' => 'Crea un altre compte',
'createacct-benefit-heading' => '{{SITENAME}} és feta per gent com tu.',
'createacct-benefit-body1' => '{{PLURAL:$1|edició|edicions}}',
'createacct-benefit-body2' => '{{PLURAL:$1|pàgina|pàgines}}',
# Special:PasswordReset
'passwordreset' => 'Restablir contrasenya',
+'passwordreset-text-one' => 'Cal completar aquest formulari per reiniciar la contrasenya',
'passwordreset-legend' => 'Restablir contrasenya',
'passwordreset-disabled' => "S'ha desactivat el restabliment de contranyes en aquest wiki.",
'passwordreset-emaildisabled' => 'Les opcions de correu electrònic no estan habilitades en aquest wiki.',
'version-license' => 'Llicència',
'version-poweredby-credits' => "El wiki funciona gràcies a '''[//www.mediawiki.org/ MediaWiki]''', copyright © 2001-$1 $2.",
'version-poweredby-others' => 'altres',
+'version-poweredby-translators' => 'Traductors de translatewiki.net',
'version-credits-summary' => 'El nostre reconeixement a les següents persones per la seva aportació a [[Special:Version|MediaWiki]]',
'version-license-info' => "MediaWiki és programari lliure, podeu redistribuir-lo i/o modificar-lo sota els termes de la Llicència Pública General GNU publicada per la Free Software Foundation, ja sigui de la seva versió 2 o (a elecció vostra) qualsevol versió posterior.
'search-redirect' => '(дlасахьажийна $1)',
'search-section' => '(дакъа $1)',
'search-suggest' => 'Хила мега ахьа лоьхарг: $1',
-'search-interwiki-caption' => 'Ð\93еÑ\80гаÑ\80а кÑ\85олламаш',
+'search-interwiki-caption' => 'Ð\93еÑ\80гаÑ\80а пÑ\80оекÑ\82аш',
'search-interwiki-default' => '$1 хилам.:',
'search-interwiki-more' => '(кхин)',
'mwsuggest-disable' => 'ДӀабайа лахаран хьехам',
'newpageletter' => 'К',
'boteditletter' => 'б',
'rc_categories_any' => 'Муьлхаа',
+'rc-change-size-new' => 'Хийцам бинчул тӀехьа болу барам: $1 {{PLURAL:$1|байт|байташ}}',
'newsectionsummary' => '/* $1 */ Керла хьедар',
'rc-enhanced-expand' => 'Гайта ма дарра дерг (лелош ю JavaScript)',
'rc-enhanced-hide' => 'Ма дарра дерг къайладаккха',
'confirmemail_body_set' => 'Someone, probably you, from IP address $1,
has set the email address of the account "$2" to this address on {{SITENAME}}.
-To confirm that this account really does belong to you and reactivate
+To confirm that this account really does belong to you and activate
email features on {{SITENAME}}, open this link in your browser:
$3
'prefs-signature' => 'امضا',
'prefs-dateformat' => 'آرایش تاریخ',
'prefs-timeoffset' => 'فاصلهٔ زمانی',
-'prefs-advancedediting' => 'عمومی',
+'prefs-advancedediting' => 'تÙ\86ظÛ\8cÙ\85ات عÙ\85Ù\88Ù\85Û\8c',
'prefs-editor' => 'ویرایشگر',
'prefs-preview' => 'پیشنمایش',
'prefs-advancedrc' => 'گزینههای پیشرفته',
'right-hideuser' => 'قطع دسترسی کاربر و پنهان کردن آن از دید عموم',
'right-ipblock-exempt' => 'تاثیر نپذیرفتن از قطع دسترسیهای آیپی، خودکار یا فاصلهای',
'right-proxyunbannable' => 'تاثیر نپذیرفتن از قطع دسترسی خودکار پروکسیها',
-'right-unblockself' => 'دسترسÛ\8c Ø®Ù\88د را باز Ú©Ù\86Ù\86د',
+'right-unblockself' => 'بازکردÙ\86 دسترسÛ\8c Ø®Ù\88د',
'right-protect' => 'تغییر میزان محافظت صفحهها و ویرایش صفحههای محافظت شده آبشاری',
'right-editprotected' => 'ویرایش صفحههای محافظت شده به عنوان "{{int:protect-level-sysop}}"',
'right-editsemiprotected' => 'ویرایش صفحه حفاظتشده به عنوان "{{int:protect-level-autoconfirmed}}"',
'exif-compression-4' => 'رمزگذاری نمابر سیسیآیتیتی گروه ۴',
'exif-copyrighted-true' => 'دارای حق تکثیر',
-'exif-copyrighted-false' => 'Ù\85اÙ\84Ú©Û\8cت عÙ\85Ù\88Ù\85Û\8c',
+'exif-copyrighted-false' => 'Ù\88ضعÛ\8cت ØÙ\82â\80\8cتکثÛ\8cر تعÛ\8cÛ\8cÙ\86 Ù\86شدÙ\87â\80\8cاست',
'exif-unknowndate' => 'تاریخ نامعلوم',
$digitGroupingPattern = "##,##,###";
-$linkTrail = '/^((?:[a-z]|ક્|ખ્|ગ્|ઘ્|ચ્|છ્|જ્|ઝ્|ટ્|ઠ્|ડ્|ઢ્|ણ્|ત્|થ્|દ્|ધ્|ન્|પ્|ફ્|બ્|ભ્|મ્|ય્|ર્|લ્|વ્|સ્|શ્|ષ્|હ્|ળ્|ક્ષ્|જ્ઞ્|અ|આ|ઇ|ઈ|ઉ|ઊ|એ|ઐ|ઓ|ઔ|અં|અઃ|અઁ|ઍ|ઑ|ઋ|ઁ|઼|।|્|ા|િ|ી|ુ|ૂ|ે|ૈ|ો|ૌ|ં|ઃ|ઁ|ૅ|ૉ|ૃ)+)(.*)$/sDu';
+$linkTrail = "/^([\x{0A80}-\x{0AFF}]+)(.*)$/sDu";
$messages = array(
# User preference toggles
'otherlanguages' => 'Այլ լեզուներով',
'redirectedfrom' => '(Վերահղված է $1ից)',
'redirectpagesub' => 'Վերահղման էջ',
-'lastmodifiedat' => 'Այս էջը վերջին անգամ փոփոխվել է $2, $1։',
+'lastmodifiedat' => 'Այս էջը վերջին անգամ փոփոխվել է ժամը $2-ին, $1 թվին։',
'viewcount' => 'Այս էջին դիմել են {{PLURAL:$1|մեկ անգամ|$1 անգամ}}։',
'protectedpage' => 'Պաշտպանված էջ',
'jumpto' => 'Անցնել՝',
'site-rss-feed' => '$1 RSS Սնուցում',
'site-atom-feed' => '$1 Atom Սնուցում',
'page-rss-feed' => '«$1» RSS Սնուցում',
-'page-atom-feed' => '«$1» Atom Սնուցում',
+'page-atom-feed' => '«$1» «Ատոմ» սնուցում',
'red-link-title' => '$1 (էջը գոյություն չունի)',
'sort-descending' => 'Դասավորել՝ մեծից փոքր',
'sort-ascending' => 'Դասավորել՝ փոքրից մեծ',
'protectedpagewarning' => "'''ԶԳՈՒՇԱՑՈՒՄ. Այս էջը պաշտպանված է փոփոխություններից. այն կարող են խմբագրել միայն ադմինիստրատորները։'''",
'semiprotectedpagewarning' => "'''Ծանուցում.''' Այս էջը պաշտպանված է. այն կարող են խմբագրել միայն գրանցված մասնակիցները։",
'cascadeprotectedwarning' => "'''Զգուշացում.''' Այս էջը պաշտպանված է և կարող է խմբագրվել միայն ադմինիստրատորների կողմից, քանի որ այն ընդգրկված է հետևյալ կասկադային-պաշտպանմամբ {{PLURAL:$1|էջում|էջերում}}.",
-'titleprotectedwarning' => "'''Զգուշացում. Այս էջը պաշտպանված է. այն կարող են խմբագրել միայն [[Special:ListGroupRights|համապատասխան իրավունքներով]] մասնակիցները։'''
+'titleprotectedwarning' => "'''Զգուշացում. այս էջը պաշտպանված է. այն կարող են ստեղծել միայն [[Special:ListGroupRights|համապատասխան իրավունքներով]] մասնակիցները։'''
-Վերջին քրառումը տրամադրված է ստորև ծանոթության համար։",
+Վերջին գրառումը տրամադրված է ստորև՝ ծանոթության համար․",
'templatesused' => 'Այս էջում օգտագործված {{PLURAL:$1|կաղապարը|կաղապարները}}.',
'templatesusedpreview' => 'Այս նախադիտման մեջ օգտագործված {{PLURAL:$1|կաղապարը|կաղապարները}}.',
'templatesusedsection' => 'Այս բաժնում օգտագործված {{PLURAL:$1|կաղապարը|կաղապարները}}.',
'deletecomment' => 'Պատճառ.',
'deleteotherreason' => 'Լրացուցիչ պատճառ',
'deletereasonotherlist' => 'Ուրիշ պատճառ',
-'deletereason-dropdown' => '*Առհասարակ ջնջման պատճառներ
-** Õ\84Õ«Õ¡Õ¯ ÕÕ´Õ¢Õ¡Õ£Ö\80Õ¸Õ²ի խնդրանքով
-** Հեղինակային իրավունքի խախտում
+'deletereason-dropdown' => '*Ջնջման տարածված պատճառներ
+** Õ\80Õ¥Õ²Õ«Õ¶Õ¡Õ¯ի խնդրանքով
+** Õ\80Õ¥Õ²Õ«Õ¶Õ¡Õ¯Õ¡ÕµÕ«Õ¶ Õ«Ö\80Õ¡Õ¾Õ¸Ö\82Õ¶Ö\84Õ¶Õ¥Ö\80Õ« ÕÕ¡ÕÕ¿Õ¸Ö\82Õ´
** Վանդալություն',
'delete-edit-reasonlist' => 'Խմբագրել ջնջման պատճառները',
'notacceptable' => 'Վիքի-սպասարկիչը չի կարող տվյլաները տրամադրել ձեր զննարկիչի կողմից կարդացվող ֆորմատով։',
# Attribution
-'anonymous' => '{{grammar:genitive|{{SITENAME}}}} անանուն մասնակիցները',
+'anonymous' => '{{SITENAME}}ի անանուն {{PLURAL:$1|մասնակից|մասնակիցներ}}',
'siteuser' => '{{grammar:genitive|{{SITENAME}}}} մասնակից $1',
-'lastmodifiedatby' => 'Այս էջը վերջին անգամ փոփոխվել է $2, $1 $3 մասնակցի կողմից։',
+'lastmodifiedatby' => 'Այս էջը վերջին անգամ փոփոխվել է ժամը $2-ին, $1 թվին՝ $3 մասնակցի կողմից։',
'othercontribs' => 'Հիմնված է {{grammar:genitive|$1}} գործի վրա։',
'others' => 'այլոք',
'siteusers' => '{{grammar:genitive|{{SITENAME}}}} մասնակից(ներ) $1',
'cannotdelete-title' => 'Tidak dapat menghapus halaman "$1"',
'delete-hook-aborted' => 'Penghapusan dibatalkan oleh kait parser.
Tidak ada keterangan.',
+'no-null-revision' => 'Tidak dapat membuat revisi null baru untuk halaman "$1"',
'badtitle' => 'Judul tidak sah',
'badtitletext' => 'Judul halaman yang diminta tidak sah, kosong, atau judul antarbahasa atau antarwiki yang salah sambung.',
'perfcached' => 'Data berikut ini diambil dari singgahan dan mungkin bukan data mutakhir. {{PLURAL:$1||}}$1 hasil maksimal tersedia di tembolok.',
'yourname' => 'Nama pengguna:',
'userlogin-yourname' => 'Nama pengguna',
'userlogin-yourname-ph' => 'Masukkan nama pengguna Anda',
+'createacct-another-username-ph' => 'Masukkan nama pengguna',
'yourpassword' => 'Kata sandi:',
'userlogin-yourpassword' => 'Kata sandi',
'userlogin-yourpassword-ph' => 'Masukkan kata sandi',
'helplogin-url' => 'Help:Masuk log',
'userlogin-helplink' => '[[{{MediaWiki:helplogin-url}}|Bantuan masuk log]]',
'createacct-join' => 'Masukkan informasi Anda di bawah ini.',
+'createacct-another-join' => 'Masukkan informasi akun baru di bawah ini.',
'createacct-emailrequired' => 'Alamat surel',
'createacct-emailoptional' => 'Alamat surel (opsional)',
'createacct-email-ph' => 'Masukkan alamat surel Anda',
+'createacct-another-email-ph' => 'Masukkan alamat surel',
'createaccountmail' => 'Gunakan kata sandi acak sementara dan kirimkan ke surel yang tercantum di bawah',
'createacct-realname' => 'Nama asli (opsional)',
'createaccountreason' => 'Alasan:',
'createacct-captcha' => 'Pemeriksaan keamanan',
'createacct-imgcaptcha-ph' => 'Masukkan teks yang Anda lihat di atas',
'createacct-submit' => 'Buat akun Anda',
+'createacct-another-submit' => 'Buat akun lain',
'createacct-benefit-heading' => '{{SITENAME}} dibuat oleh orang-orang seperti Anda.',
'createacct-benefit-body1' => '{{PLURAL:$1|suntingan}}',
'createacct-benefit-body2' => '{{PLURAL:$1|halaman}}',
'changeemail-submit' => 'Ubah surel',
'changeemail-cancel' => 'Batalkan',
+# Special:ResetTokens
+'resettokens' => 'Reset token',
+'resettokens-text' => 'Anda dapat me-reset Token yang memungkinkan akses ke data pribadi tertentu yang terkait dengan akun Anda di sini.
+
+Anda harus melakukannya jika Anda secara tidak sengaja berbagi dengan seseorang atau jika akun Anda telah disusupi.',
+'resettokens-no-tokens' => 'Tidak ada token untuk di-reset.',
+'resettokens-legend' => 'Reset token',
+'resettokens-tokens' => 'Token:',
+'resettokens-token-label' => '$1 (nilai saat ini: $2)',
+'resettokens-watchlist-token' => 'Daftar pantauan token web feed',
+'resettokens-done' => 'Reset token.',
+'resettokens-resetbutton' => 'Reset token yang dipilih',
+
# Edit page toolbar
'bold_sample' => 'Teks ini akan dicetak tebal',
'bold_tip' => 'Teks tebal',
'recentchangesdays-max' => '(maksimum $1 {{PLURAL:$1|hari|hari}})',
'recentchangescount' => 'Standar jumlah suntingan yang ditampilkan:',
'prefs-help-recentchangescount' => 'Opsi ini berlaku untuk perubahan terbaru, versi terdahulu halaman, dan log.',
+'prefs-help-watchlist-token2' => 'Ini adalah kunci rahasia (token) ke web feed dari daftar pantauan Anda.
+Siapa saja yang tahu akan dapat melihat daftar pantauan Anda, jadi jangan dibagikan.
+[[Special:ResetTokens|Klik di sini jika Anda perlu menyetel ulang]].',
'savedprefs' => 'Preferensi Anda telah disimpan',
'timezonelegend' => 'Zona waktu:',
'localtime' => 'Waktu setempat:',
'randompage' => 'Halaman sembarang',
'randompage-nopages' => 'Tidak ada halaman pada {{PLURAL:$2||}}ruang nama berikut: $1.',
+# Special:RandomInCategory
+'randomincategory' => 'Halaman acak dalam kategori',
+'randomincategory-invalidcategory' => '"$1" bukanlah nama kategori yang berlaku.',
+'randomincategory-nopages' => 'Tidak ada halaman dalam [[:Category:$1]].',
+'randomincategory-selectcategory' => 'Dapatkan halaman acak dari kategori: $1 $2.',
+'randomincategory-selectcategory-submit' => 'Lanjut',
+
# Random redirect
'randomredirect' => 'Pengalihan sembarang',
'randomredirect-nopages' => 'Tak terdapat pengalihan pada ruang nama "$1".',
'pageswithprop-text' => 'Halaman ini berisi daftar halaman yang menggunakan properti halaman tertentu.',
'pageswithprop-prop' => 'Nama properti:',
'pageswithprop-submit' => 'Lanjut',
+'pageswithprop-prophidden-long' => 'teks panjang nilai properti tersembunyi ($1 kilobita)',
+'pageswithprop-prophidden-binary' => 'nilai properti biner yang tersembunyi ($1 kilobita)',
'doubleredirects' => 'Pengalihan ganda',
'doubleredirectstext' => 'Halaman ini memuat daftar halaman yang dialihkan ke halaman pengalihan yang lain.
'mostrevisions' => 'Halaman dengan perubahan terbanyak',
'prefixindex' => 'Semua halaman dengan awalan',
'prefixindex-namespace' => 'Semua halaman dengan awalan (ruang nama $1)',
+'prefixindex-strip' => 'Strip awalan dalam daftar',
'shortpages' => 'Halaman pendek',
'longpages' => 'Halaman panjang',
'deadendpages' => 'Halaman buntu',
'version-license' => 'Lisensi',
'version-poweredby-credits' => "Wiki ini didukung oleh '''[//www.mediawiki.org/ MediaWiki]''', hak cipta © 2001-$1 $2.",
'version-poweredby-others' => 'lainnya',
+'version-poweredby-translators' => 'penerjemah translatewiki.net',
'version-credits-summary' => 'Kami ingin mengakui orang-orang berikut atas kontribusinya terhadap [[Special:Version|MediaWiki]].',
'version-license-info' => 'MediaWiki adalah perangkat lunak bebas; Anda diperbolehkan untuk mendistribusikan dan/atau memodfikasinya dengan persyaratan Lisensi Publik Umum GNU yang diterbitkan oleh Free Software Foundation; versi 2 atau terbaru.
'hidden-categories' => '{{PLURAL:$1|隠しカテゴリ}}',
'hidden-category-category' => '隠しカテゴリ',
'category-subcat-count' => '{{PLURAL:$2|このカテゴリには以下の下位カテゴリのみが含まれています。|このカテゴリには $2 下位カテゴリが含まれており、そのうち以下の {{PLURAL:$1|$1 下位カテゴリ}}を表示しています。}}',
-'category-subcat-count-limited' => 'このカテゴリには以下の{{PLURAL:$1|下位カテゴリ| $1 下位カテゴリ}}が含まれています。',
+'category-subcat-count-limited' => 'このカテゴリには以下の{{PLURAL:$1|下位カテゴリ| $1 下位カテゴリ}}が含まれています。',
'category-article-count' => '{{PLURAL:$2|このカテゴリには以下のページのみが含まれています。|このカテゴリには $2 ページが含まれており、そのうち以下の $1 ページを表示しています。}}',
-'category-article-count-limited' => '現在のカテゴリには以下の{{PLURAL:$1|ページ| $1 ページ}}が含まれています。',
+'category-article-count-limited' => '現在のカテゴリには以下の{{PLURAL:$1|ページ| $1 ページ}}が含まれています。',
'category-file-count' => '{{PLURAL:$2|このカテゴリには以下のファイルのみが含まれています。|このカテゴリには $2 ファイルが含まれており、そのうち以下の {{PLURAL:$1|$1 ファイル}}を表示しています。}}',
-'category-file-count-limited' => '現在のカテゴリには以下の{{PLURAL:$1|ファイル| $1 ファイル}}が含まれています。',
+'category-file-count-limited' => '現在のカテゴリには以下の{{PLURAL:$1|ファイル| $1 ファイル}}が含まれています。',
'listingcontinuesabbrev' => 'の続き',
'index-category' => '検索エンジンに収集されるページ',
'noindex-category' => '検索エンジンに収集されないページ',
'filehist-comment' => 'コメント',
'filehist-missing' => 'ファイルがありません',
'imagelinks' => 'ファイルの使用状況',
-'linkstoimage' => '以下の{{PLURAL:$1|ページ| $1 ページ}}がこのファイルにリンクしています:',
+'linkstoimage' => '以下の{{PLURAL:$1|ページ| $1 ページ}}がこのファイルにリンクしています:',
'linkstoimage-more' => 'このファイルへは $1 を超える数のページからリンクがあります。
以下の一覧ではこのファイルにリンクしている最初の $1 ページのみを表示しています。
[[Special:WhatLinksHere/$2|完全な一覧]]も参照してください。',
'undeletepage' => '削除されたページの表示と復元',
'undeletepagetitle' => "'''以下は[[:$1|$1]]の削除された版です'''。",
'viewdeletedpage' => '削除されたページを表示',
-'undeletepagetext' => '以下の{{PLURAL:$1|削除されたページ| $1 件の削除されたページ}}は、保存版に残っているため復元できます。
+'undeletepagetext' => '以下の{{PLURAL:$1|削除されたページ| $1 件の削除されたページ}}は、保存版に残っているため復元できます。
保存版は定期的に消去される可能性があります。',
'undelete-fieldset-title' => '削除された版の復元',
'undeleteextrahelp' => "すべての版を復元する場合は、どのボックスにもチェックを入れていない状態で'''''{{int:undeletebtn}}'''''をクリックしてください。
'version-mediahandlers' => '미디어 핸들러',
'version-hooks' => '훅',
'version-parser-extensiontags' => '파서 확장 태그',
-'version-parser-function-hooks' => '파서 기능 훅',
+'version-parser-function-hooks' => '파서 함수 훅',
'version-hook-name' => '훅 이름',
'version-hook-subscribedby' => '훅이 사용된 위치',
'version-version' => '(버전 $1)',
'cannotdelete-title' => '"$1" എന്ന താൾ മായ്ക്കാൻ കഴിയില്ല',
'delete-hook-aborted' => 'മായ്ക്കൽ കൊളുത്തിനാൽ റദ്ദാക്കിയിരിക്കുന്നു.
വിശദീകരണമൊന്നും നൽകിയിട്ടില്ല.',
+'no-null-revision' => '"$1" എന്ന താളിന് പുതിയ ശൂന്യമായ മാറ്റമുള്ള നാൾപ്പതിപ്പ് സൃഷ്ടിക്കാൻ കഴിഞ്ഞില്ല',
'badtitle' => 'അസാധുവായ തലക്കെട്ട്',
'badtitletext' => 'താങ്കൾ ആവശ്യപ്പെട്ട തലക്കെട്ടുള്ള ഒരു താൾ നിലവിലില്ല. ഇതു തെറ്റായി അന്തർഭാഷാ/അന്തർവിക്കി കണ്ണി ചെയ്യപ്പെട്ടതു മൂലമോ, തലക്കെട്ടിൽ ഉപയോഗിക്കരുതാത്ത അക്ഷരരൂപങ്ങൾ ഉപയോഗിച്ചതു മൂലമോ സംഭവിച്ചതായിരിക്കാം.',
'perfcached' => 'താഴെ കൊടുത്തിരിക്കുന്ന വിവരം ശേഖരിച്ചു വെച്ചിരിക്കുന്നതാണ്, അതുകൊണ്ട് ചിലപ്പോൾ പുതിയതായിരിക്കണമെന്നില്ല. പരമാവധി {{PLURAL:$1|ഒരു ഫലം|$1 ഫലങ്ങൾ}} ശേഖരിച്ചുവെച്ചിരിക്കുന്നവയിൽ ഉണ്ട്.',
'recentchangesdays-max' => 'പരമാവധി {{PLURAL:$1|ഒരു ദിവസം|$1 ദിവസങ്ങൾ}}',
'recentchangescount' => 'സ്വതേ പ്രദർശിപ്പിക്കേണ്ട തിരുത്തലുകളുടെ എണ്ണം:',
'prefs-help-recentchangescount' => 'പുതിയ മാറ്റങ്ങൾ, താളിന്റെ നാൾവഴികൾ, രേഖകൾ എന്നിവക്കും ഇത് ബാധകമാണ്.',
+'prefs-help-watchlist-token2' => 'ഇത് താങ്കൾ ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയുടെ വെബ്ഫീഡിനുള്ള രഹസ്യചാവിയാണ്.
+ഇത് അറിയാവുന്നവർക്ക് താങ്കൾ ശ്രദ്ധിക്കുന്നവയെന്താണെന്ന് വായിക്കാനാവുമെന്നതിനാൽ, പങ്ക് വെയ്ക്കാതിരിക്കുക.
+[[Special:ResetTokens|ഇത് പുനസജ്ജീകരിക്കണമെങ്കിൽ ഇവിടെ ഞെക്കുക]].',
'savedprefs' => 'താങ്കളുടെ ക്രമീകരണങ്ങൾ കാത്തുസൂക്ഷിച്ചിരിക്കുന്നു.',
'timezonelegend' => 'സമയ മേഖല:',
'localtime' => 'പ്രാദേശിക സമയം:',
'prefs-signature' => 'ഒപ്പ്',
'prefs-dateformat' => 'ദിന ലേഖന രീതി',
'prefs-timeoffset' => 'സമയ വ്യത്യാസം',
-'prefs-advancedediting' => 'സാർവതàµ\8dà´°à´¿à´\95à´\82',
+'prefs-advancedediting' => 'à´ªàµ\8aà´¤àµ\81വായിà´\9fàµ\8dà´\9fàµ\81à´³àµ\8dà´³ à´\90à´\9aàµ\8dà´\9bà´¿à´\95à´\99àµ\8dà´\99ൾ',
'prefs-editor' => 'എഡിറ്റർ',
'prefs-preview' => 'എങ്ങനെയുണ്ടെന്ന് കാണൽ',
'prefs-advancedrc' => 'വിപുലമായ ഉപാധികൾ',
'right-hideuser' => 'ഒരു ഉപയോക്തൃനാമത്തെ തടയുക, പരസ്യമായി കാണപ്പെടുന്നതിൽ നിന്നും മറയ്ക്കുന്നു',
'right-ipblock-exempt' => 'ഐ.പി. തടയലുകൾ, സ്വതേയുള്ള തടയലുകൾ, റേഞ്ച് തടയലുകൾ ഒക്കെ ബാധകമല്ലാതിരിക്കുക',
'right-proxyunbannable' => 'പ്രോക്സികളെ സ്വതേ തടയുന്നത് ബാധകമല്ലാതിരിക്കുക',
-'right-unblockself' => 'à´¤à´\9fയപàµ\8dà´ªàµ\86à´\9fàµ\8dà´\9fവർ à´¸àµ\8dവയà´\82 à´¤à´\9fയൽ à´¨àµ\80à´\95àµ\8dà´\95àµ\81à´\95',
+'right-unblockself' => 'സ്വയം തടയൽ നീക്കുക',
'right-protect' => 'സംരക്ഷണ മാനത്തിൽ മാറ്റം വരുത്തുക, നിർഝരിത മാർഗ്ഗത്തിൽ സംരക്ഷിക്കപ്പെട്ടിരിക്കുന്ന താളുകൾ തിരുത്തുക',
'right-editprotected' => '"{{int:protect-level-sysop}}" എന്ന് അടയാളപ്പെടുത്തി സംരക്ഷിച്ചിട്ടുള്ള താളുകൾ തിരുത്തുക',
'right-editsemiprotected' => '"{{int:protect-level-autoconfirmed}}" എന്നടയാളപ്പെടുത്തി സംരക്ഷിച്ചിട്ടുള്ള താളുകൾ തിരുത്തുക',
'randompage' => 'ഏതെങ്കിലും താൾ',
'randompage-nopages' => 'ഇനി കൊടുത്തിരിക്കുന്ന {{PLURAL:$2|നാമമേഖലയിൽ|നാമമേഖലകളിൽ}} താളുകൾ ഒന്നുമില്ല: $1.',
+# Special:RandomInCategory
+'randomincategory' => 'വർഗ്ഗത്തിൽ നിന്ന് ക്രമരഹിതമായി എടുക്കുന്ന താൾ',
+'randomincategory-invalidcategory' => '"$1" സാധുതയുള്ള വർഗ്ഗത്തിന്റെ പേരല്ല.',
+'randomincategory-nopages' => '[[:Category:$1|വർഗ്ഗം:$1]] എന്നതിൽ താളുകളൊന്നുമില്ല.',
+'randomincategory-selectcategory' => 'ഈ വർഗ്ഗത്തിൽ നിന്നും ഏതെങ്കിലും താൾ എടുക്കുക: $1 $2.',
+'randomincategory-selectcategory-submit' => 'പോകൂ',
+
# Random redirect
'randomredirect' => 'ക്രമരഹിതമായ തിരിച്ചുവിടൽ',
'randomredirect-nopages' => '"$1" എന്ന നാമമേഖലയിൽ തിരിച്ചുവിടൽ താളുകളൊന്നുമില്ല.',
'exif-compression-7' => 'ജെപിഇജി',
'exif-copyrighted-true' => 'പകർപ്പവകാശസംരക്ഷിതം',
-'exif-copyrighted-false' => 'à´ªàµ\8aà´¤àµ\81à´¸à´\9eàµ\8dà´\9aà´¯à´\82',
+'exif-copyrighted-false' => 'à´ªà´\95ർപàµ\8dപവà´\95ാശസàµ\8dഥിതി à´¸à´\9càµ\8dà´\9càµ\80à´\95à´°à´¿à´\9aàµ\8dà´\9aà´¿à´\9fàµ\8dà´\9fà´¿à´²àµ\8dà´²',
'exif-unknowndate' => 'തീയതി അജ്ഞാതം',
'version-license' => 'അനുമതി',
'version-poweredby-credits' => "ഈ വിക്കി പ്രവർത്തിക്കാൻ '''[//www.mediawiki.org/ മീഡിയവിക്കി]''' ഉപയോഗിക്കുന്നു. പകർപ്പവകാശം © 2001-$1 $2.",
'version-poweredby-others' => 'മറ്റുള്ളവർ',
+'version-poweredby-translators' => 'പരിഭാഷാവിക്കിയിലെ പരിഭാഷകർ',
'version-credits-summary' => '[[Special:Version|മീഡിയവിക്കിയ്ക്ക്]] നൽകിയ സംഭാവനകളുടെ പേരിൽ താഴെക്കൊടുക്കുന്നവർക്ക് ഞങ്ങൾ നന്ദി പറയുന്നു.',
'version-license-info' => 'മീഡിയവിക്കി ഒരു സ്വതന്ത്ര സോഫ്റ്റ്വേറാണ്; സ്വതന്ത്ര സോഫ്റ്റ്വേർ ഫൗണ്ടേഷൻ പ്രസിദ്ധീകരിച്ചിട്ടുള്ള ഗ്നു സാർവ്വജനിക അനുവാദപത്രത്തിന്റെ പതിപ്പ് 2 പ്രകാരമോ, അല്ലെങ്കിൽ (താങ്കളുടെ ഇച്ഛാനുസരണം) പിന്നീട് പ്രസിദ്ധീകരിച്ച ഏതെങ്കിലും പതിപ്പ് പ്രകാരമോ താങ്കൾക്കിത് പുനർവിതരണം ചെയ്യാനും ഒപ്പം/അല്ലെങ്കിൽ മാറ്റങ്ങൾ വരുത്താനും സാധിക്കുന്നതാണ്.
'right-hideuser' => 'एखादे सदस्य नाव इतरांपासून लपवा',
'right-ipblock-exempt' => 'आइपी ब्लॉक्स कडे दुर्लक्ष करा',
'right-proxyunbannable' => 'प्रॉक्सी असताना ब्लॉक्स कडे दुर्लक्ष करा',
-'right-unblockself' => 'अप्रतिबंधित करा',
+'right-unblockself' => 'à¤\95à¥\8bणà¥\8dया-à¤\8fà¤\95ास à¤\85पà¥\8dरतिबà¤\82धित à¤\95रा',
'right-protect' => 'सुरक्षा पातळी बदलवा व उतार-प्रतिबंधित पानांचे संपादन करा',
'right-editprotected' => ' "{{int:protect-level-sysop}}"म्हणून नमुद केलेली सुरक्षित पाने संपादा',
'right-editsemiprotected' => '"{{int:protect-level-autoconfirmed}}" म्हणून नमुद केलेली सुरक्षित पाने संपादा',
# Special:RandomInCategory
'randomincategory' => 'वर्गातील अनियत पान',
'randomincategory-invalidcategory' => '"$1" हे अधिकृत वर्गाचे नाव नाही.',
-'randomincategory-nopages' => '[[:वर्ग:$1]] या वर्गात काहीच पाने नाहीत.',
+'randomincategory-nopages' => '[[:वर्ग:$1]] यात काहीच पाने नाहीत.',
'randomincategory-selectcategory' => 'वर्ग: $1 $2 मधून अनियत पान उपलब्ध करा.',
'randomincategory-selectcategory-submit' => 'जा',
'import-error-interwiki' => 'इंटर विकी लिंक साठी $1 पान आरक्षित केल्यामुळे ते इम्पोर्ट करू शकत नाही',
'import-error-special' => 'विशेष नामविश्वासाठी $1 पान आरक्षित केल्यामुळे ते इम्पोर्ट करू शकत नाही. या नामविश्वात पाने असत नाहीत.',
'import-error-invalid' => 'नाव अयोग्य असल्याने $1 पान इम्पोर्ट करू शकत नाही.',
+'import-error-unserialize' => ' "$1" पानाची $2 आवृत्ती अनुक्रमांकातून काढता आली नाही.ही आवृत्ती कंटेंट मॉडेल $3 वापरत असल्याचा व $4 म्हणून अनुक्रमांकीत झाली असल्याचा अहवाल प्राप्त झाला आहे.',
'import-options-wrong' => 'चुकिचे {{PLURAL:$2|विकल्प}}: <nowiki>$1</nowiki>',
'import-rootpage-invalid' => 'दिलेले मूळ पान अवैध नाव आहे',
'import-rootpage-nosubpage' => '"$1" नामविश्वाची मुल पाने, उपपानास परवानगी देत नाही.',
'imgmultigoto' => 'Gao naor de zied $1',
# Table pager
-'ascending_abbrev' => 'aofl.',
-'descending_abbrev' => 'opl.',
+'ascending_abbrev' => 'opl.',
+'descending_abbrev' => 'aofl.',
'table_pager_next' => 'Volgende',
'table_pager_prev' => 'Veurige',
'table_pager_first' => 'Eerste zied',
'right-upload' => 'Przesyłanie plików na serwer',
'right-reupload' => 'Nadpisywanie istniejącego pliku',
'right-reupload-own' => 'Nadpisywanie wcześniej przesłanego pliku',
-'right-reupload-shared' => 'Lokalne nadpisywanie pliku istniejącego we współdzielonych zasobach',
+'right-reupload-shared' => 'Lokalne nadpisywanie pliku istniejącego w repozytorium mediów',
'right-upload_by_url' => 'Przesyłanie plików z adresu URL',
'right-purge' => 'Czyszczenie pamięci podręcznej stron bez pytania o potwierdzenie',
'right-autoconfirmed' => 'Wyłączenie z ograniczeń dla użytkowników niezarejestrowanych',
'listgrouprights-removegroup' => 'Możliwość usuwania z {{PLURAL:$2|grupy|grup:}} $1',
'listgrouprights-addgroup-all' => 'Możliwość dodania użytkownika do każdej grupy',
'listgrouprights-removegroup-all' => 'Możliwość usunięcia użytkownika z każdej grupy',
-'listgrouprights-addgroup-self' => 'Może dodać własne konto do {{PLURAL:$2|grupy|grup:}} $1',
+'listgrouprights-addgroup-self' => 'Możliwość dodania własnego konta do {{PLURAL:$2|grupy|grup:}} $1',
'listgrouprights-removegroup-self' => 'Możliwość usunięcia własnego konta z {{PLURAL:$2|grupy|grup:}} $1',
'listgrouprights-addgroup-self-all' => 'Może dodać własne konto do wszystkich grup',
'listgrouprights-removegroup-self-all' => 'Może usunąć własne konto ze wszystkich grup',
'password-change-forbidden' => 'A peul pa modifiché le ciav dzora a costa wiki.',
'externaldberror' => "Ò che a l'é rivaje n'eror con la base ëd dàit d'autenticassion esterna, ò pura a l'é chiel che a l'é nen autorisà a agiornesse sò cont estern.",
'login' => 'Conession',
-'nav-login-createaccount' => 'rintré ant ël sistema',
-'loginprompt' => 'Che a varda mach che a venta avèj ij cookies abilità për podèj rintré an {{SITENAME}}.',
+'nav-login-createaccount' => 'Creé un cont o rintré ant ël sistema',
+'loginprompt' => 'Che a varda mach che a venta avèj ij bëscotin abilità për podèj rintré an {{SITENAME}}.',
'userlogin' => 'rintré ant ël sistema',
'userloginnocreate' => 'Intra',
'logout' => "Seurte da 'nt ël sistema",
# Special:ResetTokens
'resettokens' => '{{doc-special|ResetTokens}}
+In this case "token" may be translated as "key", or similar.
{{Identical|Reset token}}',
'resettokens-text' => 'Text on [[Special:ResetTokens]].',
'resettokens-no-tokens' => 'Additional text on [[Special:ResetTokens]] if the user has no tokens.',
'randompage' => 'Түбэспиччэ сирэй',
'randompage-nopages' => 'Бу {{PLURAL:$2|аат дала кураана|аат далларыгар сирэйдэр суохтар}}: $1.',
+# Special:RandomInCategory
+'randomincategory' => 'Категория хайа баҕарар ыстатыйата',
+'randomincategory-invalidcategory' => '"$1" аат категорияҕа туттуллубат.',
+'randomincategory-nopages' => '[[:Category:$1|$1 категорияҕа]] маннык ыстатыйа суох.',
+
# Random redirect
'randomredirect' => 'Түбэспиччэ утаарыы',
'randomredirect-nopages' => 'Бу аат далыгар($1) көһөрөр ыйынньыктар суохтар.',
'tog-shownumberswatching' => 'Ńelok laṛcaṛkoaḱ songkha uduḱme',
'tog-oldsig' => 'Menaḱ signạtar',
'tog-fancysig' => 'Signạcar do wikiṭesk hisạbte moneyemẽ (jahan acte hoyoḱ joṛao bạgikate)',
-'tog-showjumplinks' => '"Calaḱmẽ" beohar joṛao ehop hoyoḱma',
'tog-uselivepreview' => 'Jewet́ ńeloḱ beoharme (JavaScript jaruṛ menaḱa)',
'tog-forceeditsummary' => 'Khạli sompadon guṭkatha em oktere iń baḍae ocoyiń hoyoḱma',
'tog-watchlisthideown' => 'Ńeloḱ talikare ińaḱ joṛao kamiko danaṅme',
'virus-unknownscanner' => 'Baṅ urum anṭvayras:',
# Login and logout pages
+'welcomeuser' => 'Johar',
+'welcomecreation-msg' => 'Amaḱ ekaunṭ do̠ jhićena. Amaḱ pạsindko bodol alom hiṛińa.',
'yourname' => 'Beoboharicaḱ ńutum',
+'userlogin-yourname-ph' => 'Amaḱ beohar ńutum emme.',
'yourpassword' => 'Uku namber',
'yourpasswordagain' => 'Arhõ oku namber olme',
'remembermypassword' => 'Mitṭen khon bạṛti khata reaḱ cạbi disạ dohoḱma (Jạsti $1 {{PLURAL:$1 din reaḱ din reaḱ}} lạgit)',
# Special:PasswordReset
'passwordreset' => 'Reset hesla',
+'passwordreset-text-one' => 'Pre získanie nového hesla vyplňte tento formulár.',
+'passwordreset-text-many' => '{{PLURAL:$1|Pre získanie nového hesla zadajte jeden z údajov.}}',
'passwordreset-legend' => 'Obnoviť heslo',
'passwordreset-disabled' => 'Obnovenie hesla bolo na tejto wiki zakázané.',
'passwordreset-emaildisabled' => 'E-mailové funkcie boli na tejto wiki vypnuté.',
* @author Li3939108
* @author Liangent
* @author Linforest
+ * @author Liuxinyu970226
* @author M13253
* @author Makecat
* @author Mark85296341
它可能已被其他人删除了。',
'cannotdelete-title' => '无法删除“$1”',
'delete-hook-aborted' => '删除被扩展钩子取消。钩子并没有给出解释。',
+'no-null-revision' => '无法创建对"$1"页面新的空白修订',
'badtitle' => '错误标题',
'badtitletext' => '所请求页面的标题是无效的、不存在,跨语言或跨wiki链接的标题错误。它可能包含一个或更多的不能用于标题的字符。',
'perfcached' => '下列数据已缓存,但可能已过时。最高{{PLURAL:$1|一个结果|$1个结果}}在缓存中可用。',
'right-hideuser' => '封禁并隐藏用户名',
'right-ipblock-exempt' => '避开IP封禁、自动封禁和IP段封禁',
'right-proxyunbannable' => '避开代理服务器的自动封禁',
-'right-unblockself' => 'è\87ªå·±è§£å°\81',
+'right-unblockself' => '解å°\81ä»\96们è\87ªå·±',
'right-protect' => '更改保护级别和编辑受连锁保护的页面',
'right-editprotected' => '编辑页面保护需要“{{int:protect-level-sysop}}”',
'right-editsemiprotected' => '编辑页面保护需要“{{int:protect-level-autoconfirmed}}”',
'randompage' => '随机页面',
'randompage-nopages' => '在以下{{PLURAL:$2|名字空间|名字空间}}中没有页面:$1。',
+# Special:RandomInCategory
+'randomincategory' => '分类中的随机页面',
+'randomincategory-invalidcategory' => '“$1”不是一个有效的分类名称。',
+'randomincategory-nopages' => '[[:Category:$1]]中没有页面。',
+'randomincategory-selectcategory' => '从分类获取随机页面:$1 $2。',
+'randomincategory-selectcategory-submit' => '显示',
+
# Random redirect
'randomredirect' => '随机重定向',
'randomredirect-nopages' => '在 "$1" 名字空间中没有重定向页面。',
'version-license' => '授权协议',
'version-poweredby-credits' => "本Wiki由'''[//www.mediawiki.org/ MediaWiki]'''驱动,版权所有 © 2001-$1 $2。",
'version-poweredby-others' => '其他',
+'version-poweredby-translators' => 'translatewiki.net上的翻译者',
'version-credits-summary' => '我们感谢下列人士为[[Special:Version|MediaWiki]]作出的贡献。',
'version-license-info' => "MediaWiki是自由软件,你可以依据自由软件基金会发行的'''GNU公众授权协议'''第2版或任意后续版本的条款,传播和/或修改本软件。
<div id="siteNotice"><?php echo $this->getSkin()->getSiteNotice() ?></div>
<?php } ?>
<h1 id="firstHeading" lang="<?php
- $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
- $this->html( 'pageLanguage' );
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+ $this->text( 'pageLanguage' );
?>"><span dir="auto"><?php echo $this->data['title'] ?></span></h1>
<?php if ( $this->translator->translate( 'tagline' ) ) { ?>
<p class="tagline"><?php echo htmlspecialchars( $this->translator->translate( 'tagline' ) ) ?></p>
<!-- heading -->
<div id="mw_header"><h1 id="firstHeading" lang="<?php
- $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
- $this->html( 'pageLanguage' );
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+ $this->text( 'pageLanguage' );
?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1></div>
<div id="mw_main">
<?php if ( $this->data['sitenotice'] ) { ?><div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div><?php } ?>
<h1 id="firstHeading" class="firstHeading" lang="<?php
- $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
- $this->html( 'pageLanguage' );
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+ $this->text( 'pageLanguage' );
?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
<div id="bodyContent" class="mw-body">
<div id="siteSub"><?php $this->msg( 'tagline' ) ?></div>
<div id="siteNotice"><?php $this->html( 'sitenotice' ) ?></div>
<?php } ?>
<h1 id="firstHeading" class="firstHeading" lang="<?php
- $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getCode();
- $this->html( 'pageLanguage' );
+ $this->data['pageLanguage'] = $this->getSkin()->getTitle()->getPageViewLanguage()->getHtmlCode();
+ $this->text( 'pageLanguage' );
?>"><span dir="auto"><?php $this->html( 'title' ) ?></span></h1>
<div id="bodyContent">
<?php if ( $this->data['isarticle'] ) { ?>
}
pre, .mw-code {
padding: 1em;
- border: 1px dashed #2f6fab;
+ border: 1px solid #ddd;
color: black;
background-color: #f9f9f9;
}
</p>
!! end
+# <strike> is HTML4, <s> is HTML4/5.
+!! test
+<s> or <strike> for strikethrough
+!! input
+<strike>strike</strike>
+
+<s>s</s>
+!! result
+<p><strike>strike</strike>
+</p><p><s>s</s>
+</p>
+!! end
+
+!! test
+Non-word characters don't terminate tag names (bug 17663, 40670, 52022)
+!! input
+<b→> doesn't work! </b>
+
+<bä> doesn't work! </b>
+
+<boo> works fine </b>
+
+<s.foo>foo</s>
+
+<s.foo>s.foo</s.foo>
+
+<sub-ID#1>
+!! result
+<p><b→> doesn't work! </b>
+</p><p><bä> doesn't work! </b>
+</p><p><boo> works fine </b>
+</p><p><s.foo>foo</s>
+</p><p><s.foo>s.foo</s.foo>
+</p><p><sub-ID#1>
+</p>
+!! end
+
###
### Special characters
###
!! end
###
-### Parser hooks (see maintenance/parserTestsParserHook.php for the <tag> extension)
+### Parser hooks (see tests/parser/parserTestsParserHook.php for the <tag> extension)
###
!! test
Parser hook: empty input
!! end
###
-### (see maintenance/parserTestsStaticParserHook.php for the <statictag> extension)
+### (see tests/parser/parserTestsParserHook.php for the <statictag> extension)
###
!! test
!! end
-# This fails in the PHP parser (see bug 40670,
-# https://bugzilla.wikimedia.org/show_bug.cgi?id=40670), so disabled for it.
+# This was a bug in the PHP parser (see bug 17663 and its dups,
+# https://bugzilla.wikimedia.org/show_bug.cgi?id=17663)
!! test
Tag names followed by punctuation should not be recognized as tags
-!! options
-parsoid
!! input
<s.ome> text
!! result
* previously always considered valid (bug 34212).
*/
function testMakeNormalBlock() {
- $data = $this->getTokens();
+ $tokens = $this->getTokens();
$user = User::newFromName( 'UTApiBlockee' );
$this->markTestIncomplete( "The user UTApiBlockee does not exist" );
}
- if ( !isset( $data[0]['query']['pages'] ) ) {
+ if ( !array_key_exists( 'blocktoken', $tokens ) ) {
$this->markTestIncomplete( "No block token found" );
}
- $keys = array_keys( $data[0]['query']['pages'] );
- $key = array_pop( $keys );
- $pageinfo = $data[0]['query']['pages'][$key];
-
$this->doApiRequest( array(
'action' => 'block',
'user' => 'UTApiBlockee',
'reason' => 'Some reason',
- 'token' => $pageinfo['blocktoken'] ), null, false, self::$users['sysop']->user );
+ 'token' => $tokens['blocktoken'] ), null, false, self::$users['sysop']->user );
$block = Block::newFromTarget( 'UTApiBlockee' );
}
function runTokenTest( $user ) {
- $data = $this->getTokenList( $user );
-
- $this->assertArrayHasKey( 'query', $data[0] );
- $this->assertArrayHasKey( 'pages', $data[0]['query'] );
- $keys = array_keys( $data[0]['query']['pages'] );
- $key = array_pop( $keys );
+ $tokens = $this->getTokenList( $user );
$rights = $user->user->getRights();
- $this->assertArrayHasKey( $key, $data[0]['query']['pages'] );
- $this->assertArrayHasKey( 'edittoken', $data[0]['query']['pages'][$key] );
- $this->assertArrayHasKey( 'movetoken', $data[0]['query']['pages'][$key] );
+ $this->assertArrayHasKey( 'edittoken', $tokens );
+ $this->assertArrayHasKey( 'movetoken', $tokens );
if ( isset( $rights['delete'] ) ) {
- $this->assertArrayHasKey( 'deletetoken', $data[0]['query']['pages'][$key] );
+ $this->assertArrayHasKey( 'deletetoken', $tokens );
}
if ( isset( $rights['block'] ) ) {
- $this->assertArrayHasKey( 'blocktoken', $data[0]['query']['pages'][$key] );
- $this->assertArrayHasKey( 'unblocktoken', $data[0]['query']['pages'][$key] );
+ $this->assertArrayHasKey( 'blocktoken', $tokens );
+ $this->assertArrayHasKey( 'unblocktoken', $tokens );
}
if ( isset( $rights['protect'] ) ) {
- $this->assertArrayHasKey( 'protecttoken', $data[0]['query']['pages'][$key] );
+ $this->assertArrayHasKey( 'protecttoken', $tokens );
}
- return $data;
+ return $tokens;
}
}
}
}
- protected function doLogin() {
+ protected function doLogin( $user = 'sysop' ) {
+ if( !array_key_exists( $user, self::$users ) ){
+ throw new MWException( "Can not log in to undefined user $user" );
+ }
+
$data = $this->doApiRequest( array(
'action' => 'login',
- 'lgname' => self::$users['sysop']->username,
- 'lgpassword' => self::$users['sysop']->password ) );
+ 'lgname' => self::$users[ $user ]->username,
+ 'lgpassword' => self::$users[ $user ]->password ) );
$token = $data[0]['login']['token'];
array(
'action' => 'login',
'lgtoken' => $token,
- 'lgname' => self::$users['sysop']->username,
- 'lgpassword' => self::$users['sysop']->password,
+ 'lgname' => self::$users[ $user ]->username,
+ 'lgpassword' => self::$users[ $user ]->password,
),
$data[2]
);
protected function getTokenList( $user, $session = null ) {
$data = $this->doApiRequest( array(
- 'action' => 'query',
- 'titles' => 'Main Page',
- 'intoken' => 'edit|delete|protect|move|block|unblock|watch',
- 'prop' => 'info' ), $session, false, $user->user );
+ 'action' => 'tokens',
+ 'type' => 'edit|delete|protect|move|block|unblock|watch'
+ ), $session, false, $user->user );
- return $data;
+ if( !array_key_exists( 'tokens', $data[0] ) ){
+ throw new MWException( 'Api failed to return a token list' );
+ }
+
+ return $data[0]['tokens'];
}
public function testApiTestGroup() {
}
function getTokens() {
- $data = $this->getTokenList( self::$users['sysop'] );
-
- $keys = array_keys( $data[0]['query']['pages'] );
- $key = array_pop( $keys );
- $pageinfo = $data[0]['query']['pages'][$key];
-
- return $pageinfo;
+ return $this->getTokenList( self::$users['sysop'] );
}
/**
*/
function testWatchEdit() {
- $pageinfo = $this->getTokens();
+ $tokens = $this->getTokens();
$data = $this->doApiRequest( array(
'action' => 'edit',
'title' => 'Help:UTPage', // Help namespace is hopefully wikitext
'text' => 'new text',
- 'token' => $pageinfo['edittoken'],
+ 'token' => $tokens['edittoken'],
'watchlist' => 'watch' ) );
$this->assertArrayHasKey( 'edit', $data[0] );
$this->assertArrayHasKey( 'result', $data[0]['edit'] );
* @depends testWatchEdit
*/
function testWatchClear() {
-
- $pageinfo = $this->getTokens();
+ $tokens = $this->getTokens();
$data = $this->doApiRequest( array(
'action' => 'query',
'action' => 'watch',
'title' => $page['title'],
'unwatch' => true,
- 'token' => $pageinfo['watchtoken'] ) );
+ 'token' => $tokens['watchtoken'] ) );
}
}
$data = $this->doApiRequest( array(
/**
*/
function testWatchProtect() {
-
- $pageinfo = $this->getTokens();
+ $tokens = $this->getTokens();
$data = $this->doApiRequest( array(
'action' => 'protect',
- 'token' => $pageinfo['protecttoken'],
+ 'token' => $tokens['protecttoken'],
'title' => 'Help:UTPage',
'protections' => 'edit=sysop',
'watchlist' => 'unwatch' ) );
/**
*/
function testWatchDelete() {
- $pageinfo = $this->getTokens();
+ $tokens = $this->getTokens();
$data = $this->doApiRequest( array(
'action' => 'delete',
- 'token' => $pageinfo['deletetoken'],
+ 'token' => $tokens['deletetoken'],
'title' => 'Help:UTPage' ) );
$this->assertArrayHasKey( 'delete', $data[0] );
$this->assertArrayHasKey( 'title', $data[0]['delete'] );
assert.assertTrue( $content.is( ':hidden' ), 'after collapsing: content is hidden' );
} );
+ QUnit.test( 'mw-made-collapsible data added', 1, function ( assert ) {
+ var $collapsible;
+ $collapsible = prepareCollapsible(
+ '<div>' + loremIpsum + '</div>'
+ );
+ assert.equal( $collapsible.data( 'mw-made-collapsible' ), true, 'mw-made-collapsible data present' );
+ } );
+
+ QUnit.test( 'mw-collapsible added when missing', 1, function ( assert ) {
+ var $collapsible;
+ $collapsible = prepareCollapsible(
+ '<div>' + loremIpsum + '</div>'
+ );
+ assert.assertTrue( $collapsible.hasClass( 'mw-collapsible' ), 'mw-collapsible class present' );
+ } );
+
+ QUnit.test( 'mw-collapsed added when missing', 1, function ( assert ) {
+ var $collapsible;
+ $collapsible = prepareCollapsible(
+ '<div>' + loremIpsum + '</div>',
+ { collapsed: true }
+ );
+ assert.assertTrue( $collapsible.hasClass( 'mw-collapsed' ), 'mw-collapsed class present' );
+ } );
+
QUnit.asyncTest( 'initial collapse (mw-collapsed class)', 2, function ( assert ) {
var $collapsible, $content;
$collapsible = prepareCollapsible(